//前端接口
module.exports = app => {


    //先写几个路由--使接口地址规范化
    const route = require('express').Router()
    //引用模型的第二种方法，引用mongoose 需要在引用之前到数据库那里引用各个模型先
    // const mongoose=require('mongoose')
    //引用方法,mongoose.model('modelname')
    const Articles = require(__dirname+'/../../model/Article')
    const Category = require(__dirname+'/../../model/Category')
    const Hero = require(__dirname+'/../../model/Hero')
    const items = require(__dirname+'/../../model/Item')

    require(__dirname+'/heroin')(app, route)
    require(__dirname+'/newin')(Category, route)


    //新闻展示接口
    route.get('/news/list', async (req, res) => {
        //调出和新闻有关联的子分类及其子分类的文章
        //结果输出了新闻大分类---包裹新闻二级分类---包裹二级分类下的每个新闻信息
        // const parent=await Category.findOne({name:'[1]新闻'}).populate({
        //     path:'children',
        //     populate:({ path:'newlist'})
        // }).lean()
        // res.send(parent)
        //但是这种查询只能一次性全部查询不能每个二级分类查询5条不达预期

        //用另一种方法：聚合查询
        const parent = await Category.findOne({ name: '[1]新闻' })
        //聚合查询可以一次查询多条内容然后合并成一条内容 方法名aggregate()
        const cats = await Category.aggregate([
            //$match 条件查询 查询parent为 [1]新闻 的_id的 ——就是查询新闻二级分类  从实现来看第一条查询和where没差
            { $match: { parent: parent._id } },
            //$lookup:引入其他集合的数据
            {
                $lookup: {
                    //form写的是集合名(注意不是模型名，当模型名字为单数的时候集合名默认是模型名的复数形式)
                    from: 'articles',
                    //本地的关联字段
                    localField: '_id',
                    //外地的关联字段
                    foreignField: 'parent',
                    //取别名  显示的数组名-必须设置
                    as: 'newlist'
                }
            },
            {
                //$addFields:添加字段
                //$addFields:{字段名:{操作}}是对具体字段实行操作，本为实行增加操作，但是可以使用其他操作改为修改操作
                $addFields: {
                    //$slice类似于数组的slice也是分片取的意思
                    //$slice:[]==>注意操作符号为数组  |  从$newlis数组开始之取5个，然后赋值给每个newlist
                    newlist: { $slice: ['$newlist', 5] }
                }
            }
            //整体操作顺序，1.用$match进行数据过滤  2.用lookup拉取被关联数据  3.对拉取的数据进行个数限制
        ])
        //添加热门分类，热门分类是独立于二级分类的
        //如何获取sub的值，对cats字段进行修改就行了啊==>[只要_id]
        //注意v=>v._id 和 v=>{return v._id}不同 前者会遍历v再返回v._id数组   后者只会返回第一个v._id数据没有遍历处理
        const sub = cats.map(v => v._id)
        //unshit()方法：在数据前头添加数据
        cats.unshift({
            name: '热门',
            newlist: await Articles.find().where({
                //$in 操作：从数组里面取值,取到完 sub里面存的是二级分类的_id
                parent: { $in: sub }
            }).populate('parent').limit(5).lean()
        })
        //利用map对数据进行改造，使没有新闻都有一个categoryname
        cats.map(v => {
            //要遍历的是newlist这个数组
            v.newlist.map(n => {
                //等于父级名称-热门分类要显示原本的分类而不是热门,所以要把每个新闻的关联分类查出来
                //然后做判断，v.name是热门就取 n.parent[0].name 注意parent和newlist是同一级[仔细观察数据结构]
                //对于短语句的判断一般用三元运算符
                n.categoryName = (v.name === "热门") ? n.parent[0].name : v.name
                return n
            })
            return v
        })
        res.send(cats)
    })

    //英雄查找接口

    //明确要返回的数据结构
    //[
    //  英雄二级分类[
    //                    {单个英雄的信息}
    //                    ]
    //]


    route.get('/heroes/list', async (req, res) => {
        const parent = await Category.findOne({ name: '[1]英雄' })
        const cats = await Category.aggregate([
            { $match: { parent: parent._id } },
            {
                $lookup: {
                    from: 'heroes',
                    localField: '_id',
                    foreignField: 'categories',
                    as: 'newlist'
                }
            }
        ])
        const sub = cats.map(v => v._id)
        cats.unshift({
            name: '热门',
            newlist: await Hero.find().where({
                categories: { $in: sub }
            }).populate('categories').limit(10).lean()
        })
        cats.map(v => {
            v.newlist.map(n => {
                n.categoryName = (v.name === "热门") ? n.categories[0].name : v.name
                return n
            })
            return v
        })
        res.send(cats)
    })

    //获取具体某个新闻信息接口
    route.get('/news/list/:id', async (req, res) => {
        const id = req.params.id
        const data = await Articles.findOne({ _id: id }).lean()
        res.send(data)
    })

    //获取某个英雄信息接口
    route.get('/hero/:id', async (req, res) => {
        const id = req.params.id
        const data = await Hero.findOne({ _id: id }).populate('categories').populate('partners.heroes').populate('items2').populate('items1').lean()
        res.send(data)
    })

    app.use('/web/api', route)

}